抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

第二章ABAP数据类型学习!

第二章 数据类型

2.1 概要

  • 数据类型(Data Type):定义程序中可以使用的数据类型。

  • 数据变量(Data Variable)参照数据类型定义的、可以存储值的变量。

    数据类型与数据变量的定义实例:

    1
    2
    3
    4
    [Data TYPE]
    TYPES dtype[TYPE type | LIKE dobj]
    [Data Variable]
    DATA var [TYPE type | LIKE dobj]

    2.1.1数据类型

    ​ 数据类型在ABAP程序中用于定义变量类型。数据类型和数据对象是单独声明的,数据对象则参照数据类型定义。在程序中利用TYPES语句声明数据类型,这种数据类型只能在该程序中使用,因此也称为本地数据类型。

    ​ 本地数据类型参照已有的第二章ABAP数据类型进行声明。从数据类型层面考虑,ABAP程序的特点是可以参照ABAP数据字典自身的数据类型定义变量,这种特征便于开发者编程。


    2.1.2数据变量

    ​ 数据变量(Data Variable)是在程序中参照数据类型(Data Type)定义的值。在ABAP程序中最常用的方法是用Data语句定义变量。

    数据对象:只有在程序执行期间占用内存物理地址,ABAP语句首先利用数据对象名称确认地址,然后根据参照数据类型的字段长度及小数位等信息解析内容。数据对象里存在没有固定名称的类型,如(WRITE‘ABCDE’)、Text Symbol、(WRITE text-001)、Variable(DATA,STATICS,CLASS-DATA,PARAMETERS)、Constants等类型。


    2.1.3数据类型的种类

    数据类型

1.ABAP基本数据类型

  • ABAP基本数据类型是系统内部定义的数据类型;
  • 同C、Java语言中的c、d、f、i、n类型一样,是系统内部一定义的数据类型。
类型 最大长度 默认长度 初始值 类型 说明
C 1~262143个字符 1字符 空格 字符类型 如果未在DATA语句中指定参数<length>和<type>,则创建长度为1的字符。
N 1~262143个字符 1字符 “0” 数字字符类型 0到9之间字符组成的数字字符串
D 8个字符 / “00000000” 日期类型 日期格式必须为 YYYYMMDD
T 6个字符 / “000000” 时间类型 格式为 24-hour的 HHMMSS
I 4bytes 1 0 整数类型 取值范围为:-21477483648~+2147483647。如果运算出现非整型的结果(如小数)则进行四舍五入,而不是截断
F 8bytes / 0 浮点类型 小数位最大可以到17位,即可精确到小数点后17位;如果要求高精度,则不应该使用类型 F 数据。而应代之以类型 P 数据;如果值是小数,则要将值使用引号引起来。
P 1~16bytes 8bytes 0 包类型 该类型主要用于商务标准值,如:价格;若小数部分超过长度,则自动按四舍五入将多余的小数除掉;如果整数部分超过长度,则系统运行出错
X 1~524287 bytes 1 byte 十六进制的00 十六进制 类型X是十六进制类型,可表示内存字节实际内容,使用两个十六制字符表示一个字节中所存储的内容。但直接打印输出时,输出的还是赋值时字面意义上的值,而不是Unicode解码后的字符。如果值是字母,则一定要大写,否则赋值不进。

参考链接:12


2.局部数据类型(存在于程序内部)

在ABAP程序中用ABAP基本数据类型定义局部数据类型。另外,还可以定义包含多个ABAP基本数据类型的结构体(structure)类型。

1
TYPES dtype[TYPE type|LIKE dobj]...

3.全局数据类型(存在于数据字典中)

  • 全局数据类型是指所有程序都可以使用的数据类型。
  • 可以用TYPE语句参照ABAP数据字典里的数据类型定义变量。即SE11创建的ABAP数据字典的对象都可以用于定义数据变量。


2.2 数据类型的声明代码实例

1、参考基本数据类型定义变量

1
2
3
4
5
6
7
DATA:gv_num		TYPE i,
gv_deci TYPE f,
gv_data TYPE d,
gv_time TYPE t,
gv_text1 TYPE c,
gv_text2(2) TYPE c,
gv_longtext TYPE string.

2、参考局部数据类型定义变量

将程序中常用的数据及结构声明为一个数据类型,定义变量时可以参照此数据类型定义(C语言中的结构体、java语言中的类只不过没有基本的方法)。此数据类型只能在该程序内部使用

1
2
3
4
5
6
7
8
9
	TYPES:BEGIN OF t_struct,"!t_struct为结构体名字
co11 TYPE c,
col2 TYPE i,
col3 TYPE d,
END OF t_struct.
"!以上为声明局部变量(结构体)的过程
"!下面为定义数据类型为t_struct的变量的过程
DATA:gs_struct TYPE t_struct,
gv var LIKE gs struct-col1.

3、参照全局数据类型定义变量

参照全局数据类型定义变量是指利用ABAP数据字典(表、结构体、数据元素等)定义变量的方法,此数据类型在所有程序中都可以使用。

1
2
3
4
	DATA:gv_carrid		TYPE s_carr_id,
gv_connid TYPE sflight-carrid,
gv_matnr TYPE mara-matnr.
"!右边的TYPE类型为全局数据类型


2.3 DATA语句

DATA数据类型用于定义数据变量。变量名包括”_“,最长可以定义30位。

1、TYPE type

定义数据类型的类型。

1
DATA:gv_num		TYPE i.

冒号”:“使一个命令从逗号”,“开始执行,遇到句号”.“结束。多次执行相同命令时使用冒号”:“可以避免反复使用相同命令的现象。如声明变量。


2、LIKE num

定义与前一个变量相同类型的变量时使用该语句,num可以是任何一种数据类型的变量(字段、参数、结构体、系统变量等)。

1
DATA:gv_num1	LIKE gv_num2."!定义与gv_num1相同数据类型的变量名位gv_num2的变量

3、VALUE int

该语句用于定义变量的初始值,若未赋初始值则会使用声明的数据类型的默认初始值(见2.1概要)。

1
2
3
4
DATA:gv_num1	TYPE i		VALUE 123,
gv_flag VALUE 'X',
gv_val VALUE IS INITIAL,"!同变量的默认初始值
gv_idx LIKE sy-tabix VALUE 45.

4、LENGTH n

用于指定字段长度,但只适用于C(字符类型)、N(数字字符类型)、P(包类型)、X(十六进制)类型。

1
DATA:gv_num		TYPE n		LENGTH 2.

5、DECIMALS n

用于指定1~14位小数,只适用于数据类型P。

1
DATA:gv_num		TYPE p		DECIMALS 3.


2.4 ABAP基本语法(注释)

  • ABAP程序使用句号”.“表示一个语句的结束。
  • 代码的注释有两种
    • 符号”*“为行注释。如:*This line is comment
    • 符号” “ “为右注释。如:WRITE gv_val.”Part of line is comment.
  • 字符串使用单引号’ ‘显示。如gv_val = ‘Enjoy ABAP’.
  • 命令要使用空格分开。
1
2
gv_val='Enjoy ABAP'.    =>错误写法,=与‘之间没有写空格
gv_val = 'Enjoy ABAP'. =>正确写法


2.5 ABAP命名规则

(1)SAP规定创建ABAP数据字典的程序及数据对象后命名时,要以Z或Y开头且不能使用如INSERT/APPEND等关键字。

(2)ABAP程序中允许定义的变量名最大长度为30位,其中包含“_”符号。

ABAP命名规则


1、定义全局变量

全局变量是指在一个程序或函数内可以访问的数据类型。在程序内部的所有领域都可以参照并修改,因此没有局域性。在程序激活状态下全局变量一直占用着内存地址。定义全局变量时以G开头。

数据类型 前缀 使用实例 程序
字段 V或D GV_CARRID或GD_CARRID DATA GV_SFLGIHT TYPE S_CARR_ID或DATA GD_SFLGIHT TYPE S_CARR_ID
结构体 S GS_SFLIGHT DATA GS_SFLIGHT TYPE SFLIGHT
常量 C GC_RATE CONSTANTS GC_RATE TYPE I VALUE ‘3.14’
内表 T GT_SFLIGHT DATA GT_SFLIGHT TYPE TABLE OF SFLIGHT
O GO_ALVGRID DATA GO_ALVGIRD TYPE REF TO CL_SALV_TABLE
RANGE(范围) R GR_CARRID RANGES GR_CARRID FOR SFLIGHT-CARRID
参照变量 F GF_OBJ DATA GF_OBJ TYPE REF TO OBJECT

若需要细分命名规则,则可以把前缀长度设为3位。

前缀1 -> 范围,前缀2 -> 数据类型,前缀3 -> 数据类型

例:GVF_CARRID中G——全局、V——字段、F——浮点型。


2、局部变量

局部变量是指在程序中模块(函数、子程序等为了实现单位功能集合成块的代码)内部有效的变量。

数据类型 前缀 使用实例 程序
字段 V或D LV_CARRID或LD_CARRID DATA LV_SFLGIHT TYPE S_CARR_ID或DATA LD_SFLGIHT TYPE S_CARR_ID
结构体 S LS_SFLIGHT DATA LS_SFLIGHT TYPE SFLIGHT
常量 C LC_RATE CONSTANTS LC_RATE TYPE I VALUE ‘3.14’
内表 T LT_SFLIGHT DATA LT_SFLIGHT TYPE TABLE OF SFLIGHT
O LO_ALVGRID DATA LO_ALVGIRD TYPE REF TO CL_SALV_TABLE
RANGE(范围) R LR_CARRID RANGES LR_CARRID FOR SFLIGHT-CARRID
参照变量 F LF_OBJ DATA LF_OBJ TYPE REF TO OBJECT


2.6 ABAP基本数据类型

ABAP基本数据类型时ABAP Kernel层次中定义的数据类型,在所有ABAP程序中都可以使用。在程序中定义局部数据类型时可以使用基本数据类型。

1、固定长度的ABAP基本数据类型

数字型
初始长度 可变长度 初始值 意义
I 4 4 0 整型(自然数)
F 8 8 0 浮点型
P 8 1~~16 0 Packed number

字符型
初始长度 可变长度 初始值 意义
C 1 1~65535 ‘ ’ 文本字段
D 8 8 ‘00000000’ 日期字段(样式:YYYYMMDD)
N 1 1~65535 ‘0’ 数字文本字段(数字型字符串)
T 6 6 ‘000000’ 样式:HHMMSS

初始长度 可变长度 初始值 意义
X 1 1~65535 X‘0’ 十六进制字段

注意事项:

  • 数据类型D、F、I已经定义了技术属性,因此不用在程序中定义即可直接使用。
  • 要使用数据类型C、N、X时要指定其长度。
  • 数据类型P不指定DECIMALS就无法识别小数位。

2、数字型

ABAP/4有3种数字类型(数字型)。数字类型的输出方式为靠右对齐。

(1)整数型I

  • 值范围为-2^31(-2147483648)~2^31-1(2147483647).
  • 只支持整数类型。
  • 非整数型数据会进行四舍五入(Round)。
  • 用于计算行数、条目数、索引值等。

(2)小数型 Packed number of type P

  • 允许有小数位。
  • 可用长度为1~16B,小数位最大长度为14位。
  • 常使用于精度比较高的数据。
  • 计算类型P时,由于涉及软件因素,因此比类型I、F要慢。
  • 可使用关键词LENGTH、DECIMALS进行补充,但值得注意的是P类型在声明时必须使用DECIMALS指定小数位个数。
  • 可变长度一般是指变量名称之后可指定变量长度(1~16).
1
DATA gv_p(16) TYPE p
  • 若不指定长度则默认长度为8B。
1
DATA gv_p TYPE p
  • 程序属性设置如下图所示,应选择Fixed point arithmetic。若不选择,类型P就没有意义,与整数类型相同。

属性设置

注意事项:若在创建程序时不选择上图所示的选框则运行如下代码时会得到结果“231”。

1
2
3
4
5
6
7
DATA gv_1 TYPE p DECIMALS 1 VALUE '1.1'.
DATA gv_2 TYPE p DECIMALS 1 VALUE '2.1'.
DATA gv_3 TYPE p.

gv_3 = gv_1 * gv_2.

WRITE gv_3."!实际正确结果为2.31,但由于没有设置上面的属性所以小数点消失了

(3)浮点型F

  • 值范围为1*10^-307~1*10^308。
  • 用于定义指数(exponent),因此需要调用“FLTP_CHAR_CONVERSION”函数把其类型转换成其他数据类型后才可以输出。
  • 类型F转换成二进制时会发生进位误差。
  • 若要显示高精度的数据,则应该使用P类型。
  • 数值较大或者不需要进行四舍五入时可以适用类型F(因为在取近似值时使用,因此使用时需注意)。
  • 因为类型F是以指数形式显示,因此要调用函数“FLTP_CHAR_CONVERSION”把类型转换为其他数据类型后才能输出。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
"!输出F类型的举例
DATA:gv_float1 TYPE f VALUE '1.337'.
DATA:gv_float2 TYPE f VALUE '2.7'.
DATA:gv_fresult TYPE f.
DATA:gv_cresult TYPE c LENGTH 16.

gv_fresult = gv_float1 * gv_float2.
WRITE:/'5:',gv_fresult.

CALL FUNCTION 'FLTP_CHAR_CONVERSION'
EXPORTING
DECIM = 2
INPUT = gv_fresult
IMPORTING
FLSTR = gv_cresult.

WRITE:/'6:',gv_cresult.“!/代表换行

3、字符类型

字符类型总共有4种类型,输出时是居左对齐。

(1)字符类型C

  • 用于定义文字、数字和特殊文字。
  • 定义C类型数据时需要指定其字段长度。如果未指定则默认为1位。
  • 可变的长度为1~65535。
  • 指定C类型长度时可以使用关键字LENGTH或在变量后使用符号”()“,例:DATA:G_char(3) TYPE c.
  • 若系统只声明了变量单位声明变量类型则默认使用C类型,长度为1位。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
DATA gv_f0.“!此处的gv_f0变量与下面的gv_f1、gv_f2格式等同。
DATA gv_f1 TYPE c.
DATA gv_f2(1) TYPE c.
DATA gv_f3(2) TYPE c.
DATA gv_f4 TYPE c LENGTH 2.
DATA gv_f5(5).
DATA gv_len TYPE i.

MOVE:'CHINA' TO gv_f0,
'CHINA' TO gv_f1,
'CHINA' TO gv_f2,
'CHINA' TO gv_f3,
'CHINA' TO gv_f4,
'CHINA' TO gv_f5.

WRITE:/gv_f0,
/gv_f1,
/gv_f2,
/gv_f3,
/gv_f4.

gv_len = STRLEN(gv_f5)."!获取当前字符串的字符个数。
WRITR /gv_len.

"!输出结果:
”!C
”!C
”!C
”!CH
”!CH
”!CHINA
”! 5

(2)数字型字符串N

  • 该类型用于显示C类型数字,以字符串形式显示整数。
  • 可变长度为:1~65535。
  • 定义N类型时,当变量长度不足时,加前导零不足位数的形式输出且以字符串形式显示数值。
1
2
3
4
5
6
7
8
DATA:gv_num1 TYPE i.
DATA:gv_num2 TYPE n LENGTH 4.

gv_num1 = 89.
WRITE:/gv_num1."!输出结果:89

gv_num2 = 89.
WRITE:/gv_num2."!输出结果:0089

(3)日期类型D和时间类型T

  • 日期类型D默认长度为8位,格式为”YYYYMMDD“。
  • 时间类型T默认长度为6位,格式为”HHMMSS“。
  • 以上两种类型均可直接用来计算。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
*日期类型计算
DATA:gv_date TYPE d.
gvdate = sy-datum.
WRITE:/gv_date."!20210316

gv_date = gv_date + 5.
WRITE:/gv_date."!20210321

*时间类型计算
DATA:gv_time TYPE t.
gv_time = sy-uzeit.
WRITE:/gv_time."!233354

gv_time = gv_time - 60.
WRITE:/gv_time."!233254

2.7数学运算符

1、基本运算符(演算子)

数字类型I、F、P在数据计算中使用的基本符号及关键字如下表所示。

符号 说明 使用语法 与符号相同的关键字
+ 加法 <p> = <n> + <m> ADD <n> TO <m>
- 减法 <p> = <n> - <m> SUBTRACT <n> FROM <m>
* 乘法 <p> = <m> * <n> MULTIPLY <m> BY <n>
/ 除法 <p> = <m> / <n> DIVDE <m> BY <n>
DIV 取整 <p> = <m> DIV <n>
MOD 取余 <p> = <m> MOD <n>
** 乘幂 <p> = <m> ** <n>

2、数字运算用函数

函数 说明 使用例
ABS 返回绝对值 ABS(-100)返回100
SIGN 返回符号 负数返回“-1”,0返回“0”,正数返回“+”
CEIL 返回不小于该值的最小整数 ceil(1.3),ceil(1.7)返回2
FLOOR 返回不大于该值的最大整数 floor(1.3),floor(1.7)返回1
TRUNC 取得整数部分 trunc(1.3),trunc(1.7)返回1
FRAC 取得小数部分 frac(‘2.9’)返回0.9

3、Floating-Point函数

函数 功能
ACOS、ASIN、ATAN;COS、SIN、TAN 三角函数
COSH、SINH、TANH 双曲线函数
EXP 指数函数(e=2.71828)
LOG 自然对数函数
LOG10 常用对数函数(以10为底)
SQRT 平方根函数

2.8不定长ABAP基本数据类型

在ABAP中不定长的类型是STRING类型。此类型与C类型相似,且定义非常长的字符串时使用。string类型与基本数据类型C的不同之处是当程序执行时生成动态内存。

string类型的属性:

  • 初始长度为0,赋值后长度由复制内容的长度决定。
  • 与java中的string不同,ABAP中的string可随时赋值并修改,相应的长度也会改变。
  • 使用SHIFT(移动)时结果或与C类型不同(先右后左),主要原因就是因为string是不定长的。

字符串相关的常用函数

函数名称 语法规则 说明
FIND FIND p IN text. 查找text变量中是否存在’p’字符,存在sy-subrc返回0,反之返回4
REPLACE REPLACE g IN f WITH INTO p. 将’f’中的内容替换成’p’中的内容,g为f中的内容
TRNSLATE TRNSLTATE c TO LOWER/UPPER CASE. 将’c’中的字母进行大小写转换LOWER(小写)
SHIFT SHIFT g LEFT/RIHGHT. 对’g’中的内容进行左移或右移
CONDENSE CONDENSE c [NO-GAPS]. 去掉空格并向左对齐,选择”NO-GAPS”去掉内容中的所有空格。不选则只去掉内容开头的空格。
OVERLAY OVERLAY c1 WITH c2. 将c1中的空格使用c2中的内容按照对应位置的内容进行填充
CONCATENATE CONCATENATE f1 f2 … fn INTO g. 将f1,f2,…,fn字段按先后顺序拼接在一起存入g变量。
SPLIT SPLIT f AT g INTO h1 h2 … hn 将f中的内容按照g的分割点进行分割后依次存入h1,h2,h3中。

使用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
DATA:gv_str TYPE string,
gv_chr(4) TYPE c.

"!FIND查找
gv_str = 'ABAP'.
gv_chr = 'B'.
FIND gv_chr IN gv_str.
WRITE sy-subrc."!0
WRITE:/.
"!IF sy-subrc EQ 0.
"! WRITE 'B found'.
"!ENDIF.

"!REPLACE替换
gv_str = 'ABAP'.
gv_chr = 'BBAP'.
REPLACE 'ABAP' IN gv_str WITH INTO gv_chr.
WRITE /gv_str."!BBAP

"!TRANSLATE大小写转换
gv_str = 'ABAP'.
TRANSLATE gv_str TO LOWER CASE.
WRITE /gv_str."!abap

"!SHIFT移动
gv_str = 'ABAP'
SHIFT gv_str.
SHIFT gv_str RIGHT.
WRITE /gv_str."! BAP

"!CONDENSE去除空格
gv_str = ' AB AP'.
CONDENSE gv_str.
WRITE /gv_str."!AB AP
gv_str = ' AB AP'.
CONDENSE gv_str NO-GAPS.
WRITE /gv_str."!ABAP

"!OVERLAY替换填充
gv_str = ' B P'.
gv_chr = 'AAAA'.
OVERLAY gv_str WITH gv_chr.
WRITE /gv_str."!ABAP

"!CONCATENATE字符串拼接
gv_str = 'AB'.
gv_chr = 'AP'.
CONCATENATE gv_str gv_chr INTO gv_str.
WRITE /gv_str."!ABAP

"!SPLIT分割
gv_str = 'AB,AP'.
SPLIT gv_str AT ',' INTO gv_str gv_chr.
WRITE:/gv_str,"!AB
/gv_chr."!AP

2.9 Hexadecimal类型

Hexadecimal(十六进制)类型是指将1B由2个码位显示的类型。十六进制是为了满足二进制编码形式无法表现的数字而出现的类型。ABAP程序中十六进制主要用于印刷及图片处理部分。



3.0 数字运算符

1、基本运算法则

符号 说明 使用例 与符号相同的关键字
+ 加法 <p> = <n> + <m> ADD <n> TO <m>.
- 减法 <p> = <n> - <m> SUBTRACT <n> FROM <m>.
* 乘法 <p> = <n> * <m> MULTIPLY <n> BY <m>.
/ 除法 <p> = <n> / <m> DIVIDE <m> BY <n>.
DIV 取整 <p> = <n> DIV <m>
MOD 取余 <p> = <n> MOD <m>
** 乘幂 <p> = <n> ** <m>

部分运算符举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
DATA: gv_int1 TYPE i VALUE 2,
gv_int2 TYPE i VALUE 3,
gv_iresult TYPE i.

*加法
gv_iresult = gv_int1 + gv_int2.
WRITE: / gv_iresult.

ADD 1 TO gv_result.
WRITE: / gv_iresult."!结果的存储变量为后一个变量

*除法
DATA: gv_pack1 TYPE p DECIMALS 2 VALUE '2.17',
gv_pack2 TYPE p DECIMALS 2 VALUE '5.43',
gv_presult TYPE p DECIMALS 2.

gv_presult = gv_pack2 / gv_pack2.
WRITE: / gv_presult.

MULTIPLY gv_presult BY gv_pack2.
WRITE: / gv_presult."!结果的存储对象为第一个变量

*乘法
DATA: gv_float1 TYPE f VALUE '1.337',
gv_float2 TYPE f VALUE '2.7',
gv_fresult TYPE f,
gv_cresult TYPE c LENGTH 16.

gv_fresult = gv_float2 * gv_float1.
WRITE: / gv_fresult.

*将F类型的结果转化为C类型进行输出
CALL FUNCTION 'FLTP_CHAR_CONVERSION'
EXPORTING
DECIM = 2
INPUT = gv_fresult
IMPORTING
FLSTR = gv_cresult.

WRITE: / gv_cresult.

2、数字运算用函数

函数 说明 使用例
ABS 返回绝对值 ABS(-100)返回100
SIGN 返回符号 负数 -> -1,0 -> 0,正数 -> +
CEIL 返回不小于该值的最小整数 ceil(1.3),ceil(1.7)返回2
FLOOR 与CEIL相反 floor(1.3),floor(1.7)返回1
TRUNC 取得整数部分 trunc(1.3),trunc(1.7)返回1
FRAC 取得小数部分 frac(‘2.9’)返回0.9

部分运用函数举例

1
2
3
4
5
6
7
8
9
*ABS绝对值
DATA: gv_abs(n) TYPE n VALUE '-0079'.
gv_abs = ABS(gv_abs).
WRITE: / g_abs."!使用ABS时数字会先转换成I类型,最后以I类型显示

*SIGN返回符号
DATA: gv_sign TYPE i VALUE 00.
gv_sign = SIGN(gv_sign).
WRITE: / gv_sign.

参考链接:abap 算术运算函数


3、Floating-Point 函数

函数 功能
ACOS、ASIN、ATAN;COS、SIN、TAN 三角函数(Trigonmetric functions)
COSH、SINH、TANH 双曲线函数(Hyperbolic functions)
EXP 指数函数(Exponential functions,e = 2.7182818285)
LOG 自然对数函数(以E为底)
LOG10 常用对数函数(以10为底)
SQRT 平方根函数(Square root)


4.0 局部数据类型

1、声明类型

在程序中声明的数据类型视为局部数据类型,利用关键字TYPES声明。

1
TYPES dtype [TYPE type|LIKE dobj]...

2、定义结构体类型

利用如下语法结构,可以定义由多个字段组成的结构体类型。

1
2
3
4
5
TYPES BEGIN OF struc_type.
...
{TYPES dtype}|{include {TYPE|STRUCTURE}}.
...
TYPES END OF struc_type.

以员工信息的结构体举例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
*声明结构体类型
TYPES: BEGIN OF t_ren,
name TYPE c LENGTH 20,
country TYPE c LENGTH 15,
city TYPE c LENGTH 10,
END OF t_ten.

*定义结构体变量
DATA gs_people TYPE t_ren.

gs_people-name = 'JANG JONG SUK'.
gs_people-country = 'CHINA'.
gs_people-city = 'Beijing'.

WRITE: / gs_people-name,gs_people-country,gs_people-city.
"!输出结果
"!JANG JONG SUK CHINA Beijing

INCLUDE 关键字

利用 INCLUDE TYPE 语句可以定义嵌套结构体类型(可以理解成JAVA中的继承的概念)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
*声明结构体类型
TYPES: BEGIN OF t_ren,
name TYPE c LENGTH 20,
country TYPE c LENGTH 10,
END OF t_ten.

*定义嵌套结构体类型
TYPES: BEGIN OF t_info.
INCLUDE TYPE t_ren AS ren."!此处的AS同数据库的别名,方便区分是继承的结构体字段还是自身定义的结构体字段
TYPES: phone TYPE c LENGTH 10,
END OF t_info.

*下面的定义方式与上面的定义方式意义相同
TYPES: BEGIN OF t_info,
phone TYPE c LENGTH 10,
INCLUDE TYPE t_ren AS ren,
END OF t_info.

*定义结构体对象
DATA gs_people TYPE t_info.

gs_people-ren-name = 'JANG JONG SUK'.
gs_people-ren-country = 'CHINA'.
gs_people-ren-cite = 'Beijing'.
gs_people-phone = '123456789'.

WRITE: / gs_people-ren-name,gs_people-ren-country,gs_people-ren-cite,gs_people-phone.
"!输出结果为:
"!JANG JONG SUK CHINA Beijing 123456789

注意事项:使用嵌套结构体中的变量时以结构体-结构体-字段名的形式显示。


利用 INCLUDE STRUCTRER 语句,可以把DATA语句定义的结构体或者ABAP数据字典存在的结构体包含到嵌套结构体中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DATA: BEGIN OF gs_ren,
name TYPE c LENGTH 20,
country TYPE c LENGTH 15,
city TYPE c LENGTH 10,
END OF gs_ren.

DATA: BEGIN OF gs_people.
INCLUDE STRUCTURE gs_ren AS ren.
DATA: phone TYPE c LENGTH 10,
END OF gs_people.

gs_people-ren-name = 'JANG JONG SUK'.
gs_people-ren-country = 'CHINA'.
gs_people-ren-city = 'Beijing'.
gs_people-phone = '123456879'.

WRITE: / gs_people-ren-name,gs_people-ren-country,gs_people-ren-cite,gs_people-phone.
"!输出结果为:
"!JANG JONG SUK CHINA Beijing 123456789

注意事项:使用嵌套结构时,如果不适用AS起别名则在上面的例子中赋值语句与输出语句如下:

1
2
3
4
5
6
7
8
gs_people-name = 'JANG JONG SUK'.
gs_people-country = 'CHINA'.
gs_people-city = 'Beijing'.
gs_people-phone = '123456879'.

WRITE: / gs_people-name,gs_people-country,gs_people-cite,gs_people-phone.
"!输出结果为:
"!JANG JONG SUK CHINA Beijing 123456789

同样可以输出并使用,但在代码规范上并不规范。



5.0 ABAP数据字典数据类型

ABAP数据字典中的数据类型为全局数据类型。ABAP数据字典(表、结构体、数据元素)是在所有程序中都可以用来声明变量的因素。

ABAP数据字典类型大致分为下列3种形式:

  • 表及视图:…TYPE dbtab,…TYPE dbtab-comp
  • 数据类型:数据元素(Data Element)、结构体、表类型
  • 类型组(Type Groups)

可以通过SE11创建、修改及查询ABAP数据字典。


1、参照表、试图声明数据类型

可以参照数据库表和视图定义结构体及内表。另外,还可以直接参照表里的字段定义变量。

1
2
3
4
5
6
7
DATA: gs_sflight TYPE sflight.

SELECT SINGLE * FROM sflight INTO gs_sflight WHERE CARRID = 'AA'."!从数据库表SFLIGHT中取得编号为AA的数据

WRITE: / gs_sflight-CARRID,gs_sflight-CONNID,gs_sflight-FLDATE,gs_sflight-PRICE,gs_sflight-CURRENCY,gs_sflight-PLANETYPE.
*输出结果
*AA 0017 2011.05.15 1.00 USD America

参照数据库表及视图定义个别字段。

1
2
3
4
5
6
7
8
9
10
DATA: GV_CARRID TYPE SFLIGHT-CARRID,
GV_CONNID TYPE SFLIGHT-CONNID,
GV_FLDATE TYPE SFLIGHT-FLDATE.

GV_CARRID = 'AA'.
GV_CONNID = '0017'.
GV_FLDATE = SY-DATUM."!当前系统日期

WRITE: / GV_CARRID,GV_CONNID,GV_FLDATE.
"!输出结果:AA 0017 2011.05.09

2、参照基本数据类型定义变量

(1)数据元素(Data Element)

ABAP数据字典中用数据元素(Data Element)定义个别字段。数据元素类型是参照域二定义的(可以在数据元素级别上直接定义类型)。一个域可以在多个数据元素中使用,且一个数据元素可以在多个数据表中使用。

1
2
3
4
5
*利用数据元素定义变量
DATA gs_carrid TYPE s_carr_id.

gs_carrid = 'AA'.
WRITE: 'Carrid:',gs_carrid."!Carrid:AA

(2)利用结构体的TYPE定义

需要结合多个表里的字段一并使用时,用结构体定义变量。

1
TYPE <dtyoe> TYPE <structure>.

(3)利用类型组的TYPE定义

类型组是以 INCLUDE 技术为基础的,因此在SAP 4.5A版本以后才开始使用此概念。组合多种数据类型进行声明时使用类型组,它可以在所有程序中使用。

1
TYPE-POOLS name.

(4)ABAP数据字典类型与ABAP基本数据类型

ABAP语言中除了基本数据类型,还存在ABAP数据字典类型。所谓ABAP数据字典类型是指在ABAP数据字典中将经常使用的数据类型事先定义的实例。从开发者角度而言此类型与基本数据类型没有区别。因为在程序执行过程中ABAP解释程序会自动解析。

1
2
3
*以下两句话都是定义长度为10的字符类型的代码
DATA gv_f1(10) TYPE c.
DATA gv_f2 TYPE char10.

程序中经常使用的ABAP数据字典类型见下:

ABAP数据字典与基本数据类型



6.0 赋值

1、给变量赋值

在ABAP中定义变量时可以通过VALUE语句赋值初始值,实际处理数据的程序中使用MOVE或WRITE TO 语句给变量赋值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
*定义变量时赋初始值
DATA gv_f1 TYPE i VALUE 10.
DATA gv_f2 TYPE i.

*使用“=”号赋值
gv_f2 = gv_f1.

*使用MOVE TO语句赋值
MOVE gv_f1 TO gv_f2.

*使用MOVE-CORRESPONDING TO 赋值,这种方式可以给结构体变量、内表以及字符串字段值之间赋值
MOVE-CORRESPONDING <STRING1> TO <STRING2>.

*使用WRITE TO 语句赋值
WRITE gv_f1 TO gv_f2[<option>].

(1)MOVE语句

① MOVE TO 语句与<f2> = <f1>中的Equal(=)语句相同。

② MOVE语句还可以用于类型转换,即<f1>的数据类型会转换成<f2>类型。

③ 当字段名及顺序不同的结构体之间相互赋值时,如果用MOVE语句,则会按顺序进行赋值。

④ 在ABAP语言中除了类型D(Date)与类型T(Time)外都可以相互转换类型,一共由64种形态的类型可以相互转换。


(2)MOVE-CORRESPONDING语句

① 赋值字符串字段值时可以使用MOVE-CORRESPONDING语句。这时<string1>和<string2>的字段名可以不相同。

② MOVE-CORRESPONDING语句还经常用于不同结构体之间的赋值,其特点是找到相同的字段名进行赋值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DATA: BEGIN OF gs_ren,
name(20) VALUE 'Kim Sung Joon',
country(10) VALUE 'CHINA',
city(20) VALUE 'Beijing',
END OF gs_ren.

DATA: BEGIN OF gs_info,
name(20),
city(20),
phone(10) VALUE '1521001234',
END OF gs_info.

MOVE-CORRESPONDING gs_ren TO gs_info.
WRITE: / gs_info-name,gs_info-city,gs_info-phone.
"!Kim Sung Joon Beijing 1521001234

(3)WRITE TO 语句

① 该语句的两种用法是:

  • 输出报表
  • 变量赋值

② 变量赋值时一般用WRITE TO 语句,将数据对象<f1>转换成C类型后赋值给<f2>(<f1>的类型要能转换成C类型,不然会发生Syntax或runtime error的错误)。

③ 后面的<option>里可以使用除了UNDER和NO-GAP以外的所有编辑格式选项。


2、offset 赋值

语法格式如下:

1
MOVE <f1>[+<p1>][<l1>] TO <f2>[+<p2>][<l2>].

该句式是指从f1字段的p1 + 1位开始截取长度为l1的字符串赋给f2的字段从p2 + 1位开始截取长度为l2的字符串写法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DATA: f1(8) VALUE 'ABCDEFGH',
f2(8).

MOVE f1+2(3) TO f2.
*下面这种语法结构的作用同上
f2 = f1+2(3).
DATA(f2) = f1+2(3)."!变量声明时使用
"!输出结果为:CDE


DATA: gv_f1(8) VALUE 'ABCDEFGH',
gv_f2.
DATA: gv_start TYPE i VALUE 2,
gv_length TYPE i VALUE 4.

CLEAR:gv_f2."!初始化变量
MOVE gv_f1+gv_start(gv_length) TO gv_f2.
WRITE: / gv_f2."!结果为CDEF

3、结构体之间的计算操作

结构体之间赋值用MOVE-CORRESPONDING语句,利用下面所示语句可以进行结构体之间的计算操作。

1
2
3
4
ADD-CORRESPONDING "!结构体之间相同字段名的字段进行加法运算
SUBTRACT-CORRESPONDING "!结构体之间相同字段名的字段进行减法运算
MULTIPLY-CORRESPONDING "!结构体之间相同字段名的字段进行乘法运算
DIVIDE-CORRESPONDING "!结构体之间相同字段名的字段进行除法运算


7.0 定义其他变量

1、常量

程序中经常会使用的值可以定义为常量(constant)。定义常量后在程序内不可以进行修改。

常量一般分为一般常量与结构体常量两种类型。

1
2
3
4
5
6
7
"! 1.一般常量
CONSTANTS c ... VALUE [val|IS INITIAL].

"! 2.结构体常量
CONSTANTS: BEGIN OF crec,
...
END OF crec.

实际代码演示

1
2
3
4
5
6
7
CONSTANTS: c_company(10) VALUE 'LG CNS'.
CONSTANTS: BEGIN OF c_people,
name(20) VALUE 'Zhou Wen Woo',
country VALUE 'China',
END OF c_people.
WRITE: c_company,c_people-name,c_people-country.
"!LG CNS Zhou Wen Woo China

2、静态常量

在子程序块( FORM,FUNCTION)中要持续保存局部变量值时定义为静态常量(STATICS)。即在FROM语句中内用STATICS定义的局部变量值可以保持到程序结束。

1
2
3
4
5
6
7
"!静态变量
STATICS f.

"!静态结构体变量
STATICS: BEGIN OF struc,
...
END OF struc.

接下来用代码来演示静态常量关键字STATICS与普通变量的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
*静态常量由于可以将值保存到程序结束,所以每次调用函数结束后不会被内存销毁

DO 3 TIMES."!循环
PERFORM call_subr."!调用函数
ENDDO.

FORM call_subr.
STATICS lv_val TYPE i.
lv_val = lv_val + 1.
WRITE: / 'STATICS Variable:',lv_val.

ENDFORM.

"!运行结果如下:
"!STATICS Variable: 1
"!STATICS Variable: 2
"!STATICS Variable: 3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
*普通常量,每次函数调用结束后都会被消灭初始化

DATA: gv_result TYPE i.

DO 3 TIMES.
PERFORM call_subr.
ENDDO.

FORM call_subr.
DATA lv_val TYPE i .
lv_val = lv_val + 1.
WRITE: / 'Local Variable:',lv_val.
ENDFORM.

"!运行结果如下:
"!Local Variable: 1
"!Local Variable: 1
"!Local Variable: 1

3、TABLES

使用TABLES语句定义ABAP数据字典中的数据表、视图、结构体,会生成与ABAP数据字典具有相同结构的数据对象。

1
TABLES <dbtab>.

1
2
3
4
5
6
7
8
9
10
11
12
TABLES: scarr.

SELECT * FROM scarr.
WRITE: / scarr-carrid,scarr-carrname.
ENDSELECT.

"!运行结果如下:
"!AA American Airlines
"!AB Air Berlin
"!AC Air Canada
"!AF Air France
"!AZ Alitalia

本代码实例中查询语句SELECT * FROM SCARR INTO SCARR中表与结构体名称相同,因此可以省略INTO SCARR语句。

评论